package person.zjh.kaoyansharehub.utils;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
import java.util.Random;


/**
 * @description: MD5加密工具类
 * @author 郑佳豪
 * @date 2024/11/30 11:14
 * @version 1.0
 */

public class MD5 {
    private static Random random = new Random();

    /**
     * MD5加盐加密
     * @param password 原始密码
     * @param salt 盐值
     * @return md加盐加密后的密码
     */
    public static String md5WithSalt(String password, String salt) {
        String saltedPassword = password + salt; //将未加密的密码和和盐值拼接
        return md5(saltedPassword); //根据拼接后的密码生成MD5加密的密码
    }

    // MD5 加密
    public static String md5(String input) {
        try {
            MessageDigest md = MessageDigest.getInstance("MD5"); // 获取 MessageDigest 实例，指定算法为 MD5
            byte[] messageDigest = md.digest(input.getBytes()); // 获取字节数组，调用 digest 方法完成加密
            StringBuilder hexString = new StringBuilder(); // 转换为十六进制字符串
            for (byte b : messageDigest) { //遍历字节数组
                String hex = Integer.toHexString(0xFF & b); //将字节转换为对应的16进制表示
                if (hex.length() == 1) {
                    hexString.append('0'); //每个字节都以两位十六进制表示
                }
                hexString.append(hex); //拼接
            }
            return hexString.toString(); //拼接后的结果返回
        } catch (NoSuchAlgorithmException e) {
            throw new RuntimeException("MD5 encryption failed", e);
        }
    }

    /**
     * 随机生成盐值
     * @param length 长度
     * @return 盐值
     */
    public static String generateSalt(int length) {
        String characters = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789"; // 定义可用的字符集，包括大写字母、小写字母和数字
        StringBuilder salt = new StringBuilder(); // 创建一个 StringBuilder 高效的拼接
        for (int i = 0; i < length; i++) { // 循环生成指定长度的盐值
            int index = random.nextInt(characters.length());
            salt.append(characters.charAt(index));
        }
        return salt.toString(); //将盐值返回
    }

}
